package edu.cuit.avatar.concurrent;

/**
 * 单例模式
 *      确保一个类只有一个实例，并提供一个全局的访问点
 *  1.饥汉式: 加载该类就创建该类的唯一实例
 *  2.懒汉式: 将实例化延迟到第一次获取该类的实例时
 *  3.枚举
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/17 8:50
 */
public class Singleton {
    /**
     * volatile: 可见性:线程对其修改,其它线程对其可见
     *           有序性: 禁止指令重拍
     */
    private volatile static Singleton instance;
    //饥汉式: 加载该类就创建该类的唯一实例
//    static {
//        instance = new Singleton();
//    }

    /**
     * 构造方法私有化,外部不允许通过构造方法创建其实例
     */
    private Singleton(){

    }

    /**
     * 通过静态方法返回该类的唯一实例
     * @return 该类唯一实例
     */
//    public static Singleton getInstance(){
//        return instance;
//    }

//    public synchronized static Singleton getInstance(){
//        if(instance == null)
//            instance = new Singleton();
//        return instance;
//    }

    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                //双重检查 保证唯一性
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
